package com.xxx.springboot.util;

import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import com.xxx.springboot.constant.RedisConstants;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.MessageFormat;
import java.util.*;
import java.util.regex.Pattern;

/**
 * 通用工具类
 */
public class CommonUtil {
	
    private static final int SMS_CODE_LENGTH = 6; // 短信验证码长度
    private static final String DEFAULT_VERICODE = "819918"; // 测试用短信验证码

    /**
     * 生成6位数字短信验证码
     */
    public static String generateSmsVeriCode() {
        return RandomStringUtils.randomNumeric(SMS_CODE_LENGTH);
    }

    /**
     * 校验短信验证码是否正确
     */
    public static boolean chkSmsVeriCode(String userMobile, String veriCode) {
        if (DEFAULT_VERICODE.equals(veriCode)) {
            return true;
        }
        String redisKey = MessageFormat.format(RedisConstants.REDIS_KEY_VERICODE_SMS, userMobile);
        String redisValue = "";//JedisUtil.get(redisKey);
        if (!StringUtils.isEmpty(redisValue) 
        		&& redisValue.equals(veriCode)) { // redis中短信验证码未过期，并且相同，则验证通过
            RedisUtil.delete(redisKey); // 校验之后，不再删除redis中的key
            return true;
        }
        return false;
    }

    /**
     * 获取不带-的UUID
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 判断当前操作系统是否为windows
     */
    public static boolean isWin() {
        Properties props = System.getProperties();
        String osName = props.getProperty("os.name");
        if (osName.toLowerCase().indexOf("windows") != -1) {
            return true;
        }
        return false;
    }

    /**
     * 判断当前操作系统是否为linux
     */
    public static boolean isLinux() {
        Properties props = System.getProperties();
        String osName = props.getProperty("os.name");
        if (osName.toLowerCase().indexOf("linux") != -1) {
            return true;
        }
        return false;
    }

    /**
     * 判断当前操作系统是否为mac
     * @return
     */
    public static boolean isMac() {
        Properties props = System.getProperties();
        String osName = props.getProperty("os.name");
        if (osName.toLowerCase().indexOf("mac") != -1) {
            return true;
        }
        return false;
    }

    /**
     * 校验BigDecimal是否小于0
     * 
     * @param bigDec
     * @return true：小于或等于0；false：大于0
     */
    public static boolean chkBigDecSmallerThanZero(BigDecimal bigDec) {
        return bigDec == null || bigDec.compareTo(BigDecimal.ZERO) <= 0 || bigDec.doubleValue() <= 0;
    }

    /**
     * 校验BigInteger是否小于0
     * 
     * @param bigInt
     * @return true：小于或等于0；false：大于0
     */
    public static boolean chkBigIntSmallerThanZero(BigInteger bigInt) {
        return bigInt == null || bigInt.compareTo(BigInteger.ZERO) <= 0 || bigInt.intValue() <= 0;
    }

    /**
     * 将string转换成int，如果string为空，则设置为默认值
     * @param str
     * @param defaultVlue
     * @return
     */
    public static int convertInt(String str, int defaultVlue) {
        try {
            return Integer.parseInt(str);
        } catch (Exception e) {
            return defaultVlue;
        }
    }
    
    /**
	 * 判断是否为纯数字（0或正整数）
	 * @param string
	 * @return
	 */
	public static boolean isNumeric(String string){
	    Pattern pattern = Pattern.compile("[0-9]*");
	    return pattern.matcher(string).matches();   
	}
	
	/**
	 * 获取文件名后缀
	 */
	public static String getSuffix(String filePath){
		if(filePath==null || "".equals(filePath.trim())){
			return "";
		}
		if(filePath.contains(".")){
			return filePath.substring(filePath.lastIndexOf(".")+1,filePath.length());
		}
		return "";
	}
	
	/**
	 * 字符串反转
	 */
	public static String reverseStr(String str) {
		String reverse = "";
		char[] array = str.toCharArray();
		for (int i = array.length - 1; i >= 0; i--) {
			reverse += array[i];
		}
		return reverse;
	}
    
    /**
     * 获取万能密码
     * @param userId
     * @return
     */
    public static String getUniversalPwd4Login(String userId) {
		String reverseStr = reverseStr(userId);
		String currSeconds = JodaUtil.today(JodaUtil.DATETIME_PATTERN_YYYYMMDDHHMMSS).substring(8, 12);
		return reverseStr + currSeconds;
	}
	
	/**
	 * 字符串左补齐空格
	 * @param str 原始字符串
	 * @param len 补齐后的总长度
	 * @return
	 */
    public static String leftPad(String str, int len) {
        int addSpaceCnt = len-str.length();
        String space = "";
        for (int k=0; k<addSpaceCnt; k++){
                space= " "+space;
        }
        return space + str;
    }
    
    /**
     * 秒数转换格式一： 将秒数转换成"xx小时xx分钟xx秒"的格式
     */
    public static String formatSeconds2HMS(int seconds) {
        String result = "";

        int second = seconds; // 秒
        int minute = 0; // 分
        int hour = 0; // 小时

        if (second > 60) { // 秒数 > 60
            // 获取分钟，除以60取整数，得到整数分钟
            minute = second / 60;

            // 获取秒数，秒数取余，得到整数秒数
            second = second % 60;

            // 分钟 > 60
            if (minute > 60) {
                // 获取小时，获取分钟除以60，得到整数小时
                hour = minute / 60;

                // 获取小时后取佘的分，获取分钟除以60取佘的分
                minute = minute % 60;
            }
        }

        if (second > 0) {
            result = "" + second + " 秒 ";
        }
        if (minute > 0) {
            result = "" + minute + " 分 " + result;
        }
        if (hour > 0) {
            result = "" + hour + " 小时 " + result;
        }

        return result;
    }

    /**
     * 秒数转换格式二： 将秒数转换成"xx分钟:xx秒"的格式
     */
    public static String formatSeconds2MS(int seconds) {
        String result = "";

        int second = seconds; // 秒
        int minute = 0; // 分

        if (second == 0) { // 秒数 == 0
            result = "00:00";

        } else if (second > 0 && second < 10) { // 0 < 秒数 < 10
            result = "00:0" + second;

        } else if (second > 10 && second < 60) { // 10 < 秒数 < 60
            result = "00:" + second;

        } else { // 秒数 >= 60
            // 获取分钟，除以60取整数，得到整数分钟
            minute = second / 60;

            // 获取秒数，秒数取余，得到整数秒数
            second = second % 60;

            if (second < 10) {
                result = minute + ":0" + second;
            } else {
                result = minute + ":" + second;
            }
        }

        return result;
    }
    
    /**
     * 判断两个数组的元素值是否完全相等
     */
    public static boolean checkArrEqual(String[] rightAnswerArr, String[] userAnswerArr) {
    	if(ArrayUtils.isEmpty(rightAnswerArr) || ArrayUtils.isEmpty(userAnswerArr)) {
    		return false;
    	}
    	if(rightAnswerArr.length!=userAnswerArr.length) {
    		return false;
    	}
    	Set<String> rightAnswerSet = new HashSet<>(rightAnswerArr.length);
    	Arrays.asList(rightAnswerArr).stream().forEach(e -> rightAnswerSet.add(e));
    	Set<String> userAnswerSet = new HashSet<>(userAnswerArr.length);
    	Arrays.asList(userAnswerArr).stream().forEach(e -> userAnswerSet.add(e));
    	boolean isEqual = rightAnswerSet.stream().allMatch(e -> userAnswerSet.contains(e));
    	return isEqual;
    }
    
    public static void main(String[] args) {
    	String[] rightAnswerArr = new String[]{"1", "2", "3"};
    	String[] userAnswerArr = new String[]{"2", "1", "3"};
    	System.out.println(checkArrEqual(rightAnswerArr, userAnswerArr));
	}
}
